home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / capus2 / 3dview / sources / 3dviewersaveobject.e < prev    next >
Text File  |  1995-04-03  |  14KB  |  329 lines

  1. /*"p_SaveGeoFile(mode)"*/
  2. PROC p_SaveGeoFile(mode)
  3. /********************************************************************************
  4.  * Para         : NONE
  5.  * Return       : TRUE if ok,else FALSE (Cancel).
  6.  * Description  : Save selected objects in Geo (Amiga) format.
  7.  *******************************************************************************/
  8.     DEF req:PTR TO rtfilerequester,req_string[108]:STRING
  9.     DEF save_dir[256]:STRING
  10.     DEF b_pts,b_faces
  11.     DEF n_pts,n_faces
  12.     DEF mobj:PTR TO object3d
  13.     DEF p_pts,p_faces
  14.     DEF s_handle,fichier_out[256]:STRING,w_save
  15.     DEF mylist:PTR TO lh,mynode:PTR TO ln,saveit=FALSE
  16.     IF req:=RtAllocRequestA(RT_FILEREQ,NIL)
  17.         /*RtChangeReqAttrA(req,[RTFI_FLAGS,FREQF_NOFILES])*/
  18.         IF RtFileRequestA(req,req_string,title_req,[RTFI_FLAGS,FREQF_NOFILES,RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RTFI_OKTEXT,get_3DView_string(GAD_SAVEGEO),TAG_DONE])
  19.             StrCopy(save_dir,req.dir,ALL)
  20.             AddPart(save_dir,'',256)
  21.             RtFreeRequest(req)
  22.         ELSE
  23.             RETURN FALSE
  24.         ENDIF
  25.     ELSE
  26.         RETURN FALSE
  27.     ENDIF
  28.     mylist:=mybase.objlist
  29.     mynode:=mylist.head
  30.     WHILE mynode
  31.         IF mynode.succ<>0
  32.             mobj:=mynode
  33.             IF (mode=MENU_SAVE_OBJALL) 
  34.                 saveit:=TRUE
  35.             ELSEIF ((mobj.selected=TRUE) AND (mode=MENU_SAVE_OBJSELECT)) 
  36.                 saveit:=TRUE
  37.             ELSEIF ((mobj.selected=FALSE) AND (mode=MENU_SAVE_OBJDESELECT)) 
  38.                 saveit:=TRUE
  39.             ENDIF
  40.             IF saveit=TRUE
  41.                 StringF(fichier_out,'\s\s.geo',save_dir,mynode.name)
  42.                 w_save:=p_InitReq(fichier_out)
  43.                 s_handle:=Open(fichier_out,1006)
  44.                 Write(s_handle,'3DG1\n',5)
  45.                 n_pts:=mobj.nbrspts
  46.                 StringF(fichier_out,'\d\n',n_pts)
  47.                 Write(s_handle,fichier_out,StrLen(fichier_out))
  48.                 p_pts:=mobj.datapts
  49.                 FOR b_pts:=0 TO n_pts-1
  50.                     StringF(fichier_out,'\d \d \d\n',Long(p_pts),Long(p_pts+4),Long(p_pts+8))
  51.                     Write(s_handle,fichier_out,StrLen(fichier_out))
  52.                     p_pts:=p_pts+12
  53.                 ENDFOR
  54.                 n_faces:=mobj.nbrsfcs
  55.                 p_faces:=mobj.datafcs
  56.                 FOR b_faces:=0 TO n_faces-1
  57.                     StringF(fichier_out,'3 \d \d \d 141\n',Long(p_faces),Long(p_faces+4),Long(p_faces+8))
  58.                     Write(s_handle,fichier_out,StrLen(fichier_out))
  59.                     p_faces:=p_faces+12
  60.                 ENDFOR
  61.                 IF s_handle THEN Close(s_handle)
  62.                 IF w_save THEN CloseW(w_save)
  63.                 saveit:=FALSE
  64.             ENDIF
  65.         ENDIF
  66.         mynode:=mynode.succ
  67.     ENDWHILE
  68. ENDPROC
  69. /**/
  70. /*"p_SaveDxfFile(mode)"*/
  71. PROC p_SaveDxfFile(mode)
  72. /********************************************************************************
  73.  * Para         : NONE
  74.  * Return       : TRUE if ok,else FALSE (Cancel).
  75.  * Description  : Save selected objects in Dxf (PC) format.
  76.  *******************************************************************************/
  77.     DEF req:PTR TO rtfilerequester,req_string[108]:STRING
  78.     DEF save_dir[256]:STRING
  79.     DEF b_faces
  80.     DEF n_faces
  81.     DEF mobj:PTR TO object3d
  82.     DEF p_pts,p_faces
  83.     DEF s_handle=NIL,fichier_out[256]:STRING,w_save=NIL
  84.     /*DEF x1,y1,z1,x2,y2,z2,x3,y3,z3*/
  85.     DEF str_x1[20]:STRING,str_y1[20]:STRING,str_z1[20]:STRING
  86.     DEF str_x2[20]:STRING,str_y2[20]:STRING,str_z2[20]:STRING
  87.     DEF str_x3[20]:STRING,str_y3[20]:STRING,str_z3[20]:STRING
  88.     DEF mylist:PTR TO lh,mynode:PTR TO ln,saveit=FALSE
  89.     IF req:=RtAllocRequestA(RT_FILEREQ,NIL)
  90.         /*RtChangeReqAttrA(req,[RTFI_FLAGS,FREQF_NOFILES])*/
  91.         IF RtFileRequestA(req,req_string,title_req,[RTFI_FLAGS,FREQF_NOFILES,RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RTFI_OKTEXT,get_3DView_string(GAD_SAVEDXF),TAG_DONE])
  92.             StrCopy(save_dir,req.dir,ALL)
  93.             AddPart(save_dir,'',256)
  94.             RtFreeRequest(req)
  95.         ELSE
  96.             RETURN FALSE
  97.         ENDIF
  98.     ELSE
  99.         RETURN FALSE
  100.     ENDIF
  101.     mylist:=mybase.objlist
  102.     mynode:=mylist.head
  103.     WHILE mynode
  104.         IF mynode.succ<>0
  105.             mobj:=mynode
  106.             IF (mode=MENU_SAVE_OBJALL) 
  107.                 saveit:=TRUE
  108.             ELSEIF ((mobj.selected=TRUE) AND (mode=MENU_SAVE_OBJSELECT)) 
  109.                 saveit:=TRUE
  110.             ELSEIF ((mobj.selected=FALSE) AND (mode=MENU_SAVE_OBJDESELECT)) 
  111.                 saveit:=TRUE
  112.             ENDIF
  113.             IF saveit=TRUE
  114.                 StringF(fichier_out,'\s\s.dxf',save_dir,mynode.name)
  115.                 s_handle:=Open(fichier_out,1006)
  116.                 w_save:=p_InitReq(fichier_out)
  117.                 Write(s_handle,'0\nSECTION\n2\nENTITIES\n0\n',23)
  118.                 p_pts:=mobj.datapts
  119.                 n_faces:=mobj.nbrsfcs
  120.                 p_faces:=mobj.datafcs
  121.                 FOR b_faces:=0 TO n_faces-1
  122.                     Write(s_handle,'3DFACE\n',7)
  123.                     Write(s_handle,'8\n',2)
  124.                     Write(s_handle,mynode.name,StrLen(mynode.name))
  125.                     Write(s_handle,'\n',1)
  126.                     StringF(str_x1,'\d\n',Long(p_pts+(Long(p_faces)*12)))
  127.                     StringF(str_y1,'\d\n',Long(p_pts+(Long(p_faces)*12)+4))
  128.                     StringF(str_z1,'\d\n',Long(p_pts+(Long(p_faces)*12)+8))
  129.                     StringF(str_x2,'\d\n',Long(p_pts+(Long(p_faces+4)*12)))
  130.                     StringF(str_y2,'\d\n',Long(p_pts+(Long(p_faces+4)*12)+4))
  131.                     StringF(str_z2,'\d\n',Long(p_pts+(Long(p_faces+4)*12)+8))
  132.                     StringF(str_x3,'\d\n',Long(p_pts+(Long(p_faces+8)*12)))
  133.                     StringF(str_y3,'\d\n',Long(p_pts+(Long(p_faces+8)*12)+4))
  134.                     StringF(str_z3,'\d\n',Long(p_pts+(Long(p_faces+8)*12)+8))
  135.                     Write(s_handle,'10\n',3)
  136.                     Write(s_handle,str_x1,StrLen(str_x1))
  137.                     Write(s_handle,'20\n',3)
  138.                     Write(s_handle,str_y1,StrLen(str_y1))
  139.                     Write(s_handle,'30\n',3)
  140.                     Write(s_handle,str_z1,StrLen(str_z1))
  141.                     /**/
  142.                     Write(s_handle,'11\n',3)
  143.                     Write(s_handle,str_x2,StrLen(str_x2))
  144.                     Write(s_handle,'21\n',3)
  145.                     Write(s_handle,str_y2,StrLen(str_y2))
  146.                     Write(s_handle,'31\n',3)
  147.                     Write(s_handle,str_z2,StrLen(str_z2))
  148.                     /**/
  149.                     Write(s_handle,'12\n',3)
  150.                     Write(s_handle,str_x3,StrLen(str_x3))
  151.                     Write(s_handle,'22\n',3)
  152.                     Write(s_handle,str_y3,StrLen(str_y3))
  153.                     Write(s_handle,'32\n',3)
  154.                     Write(s_handle,str_z3,StrLen(str_z3))
  155.                     /**/
  156.                     Write(s_handle,'13\n',3)
  157.                     Write(s_handle,str_x3,StrLen(str_x3))
  158.                     Write(s_handle,'23\n',3)
  159.                     Write(s_handle,str_y3,StrLen(str_y3))
  160.                     Write(s_handle,'33\n',3)
  161.                     Write(s_handle,str_z3,StrLen(str_z3))
  162.                     Write(s_handle,'0\n',2)
  163.                     p_faces:=p_faces+12
  164.                 ENDFOR
  165.                 Write(s_handle,'ENDSEC\n0\nEOF\n',13)
  166.                 IF s_handle THEN Close(s_handle)
  167.                 IF w_save THEN CloseW(w_save)
  168.             ENDIF
  169.             saveit:=FALSE
  170.         ENDIF
  171.         mynode:=mynode.succ
  172.     ENDWHILE
  173.     RETURN TRUE
  174. ENDPROC
  175. /**/
  176. /*"p_SaveRayFile(mode)"*/
  177. PROC p_SaveRayFile(mode)
  178. /********************************************************************************
  179.  * Para         : NONE
  180.  * Return       : TRUE if ok,else FALSE (Cancel).
  181.  * Description  : Save selected objects in Ray (amiga) format.
  182.  *******************************************************************************/
  183.     DEF req:PTR TO rtfilerequester,req_string[108]:STRING
  184.     DEF save_dir[256]:STRING
  185.     DEF b_faces
  186.     DEF n_faces
  187.     DEF mobj:PTR TO object3d
  188.     DEF p_pts,p_faces
  189.     DEF s_handle,fichier_out[256]:STRING,w_save
  190.     DEF str_1[20]:STRING
  191.     DEF str_2[20]:STRING
  192.     DEF str_3[20]:STRING
  193.     DEF mylist:PTR TO lh,mynode:PTR TO ln,saveit
  194.     IF req:=RtAllocRequestA(RT_FILEREQ,NIL)
  195.         IF RtFileRequestA(req,req_string,title_req,[RTFI_FLAGS,FREQF_NOFILES,RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RTFI_OKTEXT,get_3DView_string(GAD_SAVERAY),TAG_DONE])
  196.             StrCopy(save_dir,req.dir,ALL)
  197.             AddPart(save_dir,'',256)
  198.             RtFreeRequest(req)
  199.         ELSE
  200.             RETURN FALSE
  201.         ENDIF
  202.     ELSE
  203.         RETURN FALSE
  204.     ENDIF
  205.     mylist:=mybase.objlist
  206.     mynode:=mylist.head
  207.     WHILE mynode
  208.         IF mynode.succ<>0
  209.             mobj:=mynode
  210.             IF (mode=MENU_SAVE_OBJALL) 
  211.                 saveit:=TRUE
  212.             ELSEIF ((mobj.selected=TRUE) AND (mode=MENU_SAVE_OBJSELECT)) 
  213.                 saveit:=TRUE
  214.             ELSEIF ((mobj.selected=FALSE) AND (mode=MENU_SAVE_OBJDESELECT)) 
  215.                 saveit:=TRUE
  216.             ENDIF
  217.             IF saveit=TRUE
  218.                 StringF(fichier_out,'\s\s.ray',save_dir,mynode.name)
  219.                 w_save:=p_InitReq(fichier_out)
  220.                 s_handle:=Open(fichier_out,1006)
  221.                 p_pts:=mobj.datapts
  222.                 n_faces:=mobj.nbrsfcs
  223.                 p_faces:=mobj.datafcs
  224.                 FOR b_faces:=0 TO n_faces-1
  225.                     StringF(str_1,'\d \d \d\n',Long(p_pts+(Long(p_faces)*12)),Long(p_pts+(Long(p_faces)*12)+4),Long(p_pts+(Long(p_faces)*12)+8))
  226.                     StringF(str_2,'\d \d \d\n',Long(p_pts+(Long(p_faces+4)*12)),Long(p_pts+(Long(p_faces+4)*12)+4),Long(p_pts+(Long(p_faces+4)*12)+8))
  227.                     StringF(str_3,'\d \d \d\n',Long(p_pts+(Long(p_faces+8)*12)),Long(p_pts+(Long(p_faces+8)*12)+4),Long(p_pts+(Long(p_faces+8)*12)+8))
  228.                     Write(s_handle,'triangle\n',9)
  229.                     Write(s_handle,str_1,StrLen(str_1))
  230.                     Write(s_handle,str_2,StrLen(str_2))
  231.                     Write(s_handle,str_3,StrLen(str_3))
  232.                     /**********************************/
  233.                     p_faces:=p_faces+12
  234.                 ENDFOR
  235.                 IF s_handle THEN Close(s_handle)
  236.                 IF w_save THEN CloseW(w_save)
  237.             ENDIF
  238.         ENDIF
  239.         mynode:=mynode.succ
  240.     ENDWHILE
  241.     RETURN TRUE
  242. ENDPROC
  243. /**/
  244. /*"p_SaveBinFile(mode)"*/
  245. PROC p_SaveBinFile(mode)
  246. /********************************************************************************
  247.  * Para         : NONE
  248.  * Return       : TRUE if ok,else FALSE (Cancel).
  249.  * Description  : Save selected objects in Geo (Amiga) format.
  250.  *******************************************************************************/
  251.     DEF req:PTR TO rtfilerequester,req_string[108]:STRING
  252.     DEF save_dir[256]:STRING
  253.     DEF b_pts,b_faces
  254.     DEF n_pts,n_faces
  255.     DEF mobj:PTR TO object3d
  256.     DEF p_pts,p_faces
  257.     DEF s_handle,fichier_out[256]:STRING,w_save
  258.     DEF mylist:PTR TO lh,mynode:PTR TO ln,saveit=FALSE
  259.     DEF facteur3d,r,strfct[20]:STRING
  260.     DEF fx,fy,fz
  261.     IF req:=RtAllocRequestA(RT_FILEREQ,NIL)
  262.         /*RtChangeReqAttrA(req,[RTFI_FLAGS,FREQF_NOFILES])*/
  263.         IF RtFileRequestA(req,req_string,title_req,[RTFI_FLAGS,FREQF_NOFILES,RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RTFI_OKTEXT,get_3DView_string(GAD_SAVEBIN),TAG_DONE])
  264.             StrCopy(save_dir,req.dir,ALL)
  265.             AddPart(save_dir,'',256)
  266.             RtFreeRequest(req)
  267.         ELSE
  268.             RETURN FALSE
  269.         ENDIF
  270.     ELSE
  271.         RETURN FALSE
  272.     ENDIF
  273.     StrCopy(strfct,'1.0',ALL)
  274.     r:=RtGetStringA(strfct,8,get_3DView_string(GAD_FCT3DSAVEBIN),NIL,[RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,RT_UNDERSCORE,"_",0])
  275.     IF r
  276.         facteur3d:=p_StringToFloat(strfct)
  277.     ELSE
  278.         facteur3d:=1.0
  279.     ENDIF
  280.     mylist:=mybase.objlist
  281.     mynode:=mylist.head
  282.     WHILE mynode
  283.         IF mynode.succ<>0
  284.             mobj:=mynode
  285.             IF (mode=MENU_SAVE_OBJALL) 
  286.                 saveit:=TRUE
  287.             ELSEIF ((mobj.selected=TRUE) AND (mode=MENU_SAVE_OBJSELECT)) 
  288.                 saveit:=TRUE
  289.             ELSEIF ((mobj.selected=FALSE) AND (mode=MENU_SAVE_OBJDESELECT)) 
  290.                 saveit:=TRUE
  291.             ENDIF
  292.             IF saveit=TRUE
  293.                 StringF(fichier_out,'\s\s_pts.bin',save_dir,mynode.name)
  294.                 w_save:=p_InitReq(fichier_out)
  295.                 s_handle:=Open(fichier_out,1006)
  296.                 n_pts:=mobj.nbrspts
  297.                 Write(s_handle,[n_pts]:INT,2)
  298.                 StringF(fichier_out,'\d\n',n_pts)
  299.                 p_pts:=mobj.datapts
  300.                 FOR b_pts:=0 TO n_pts-1
  301.                     fx:=SpFix(SpMul(SpFlt(Long(p_pts)),facteur3d))
  302.                     fy:=SpFix(SpMul(SpFlt(Long(p_pts+4)),facteur3d))
  303.                     fz:=SpFix(SpMul(SpFlt(Long(p_pts+8)),facteur3d))
  304.                     Write(s_handle,[fx,fy,fz,0]:INT,8)
  305.                     p_pts:=p_pts+12
  306.                 ENDFOR
  307.                 IF s_handle THEN Close(s_handle)
  308.                 IF w_save THEN CloseW(w_save)
  309.                 StringF(fichier_out,'\s\s_fcs.bin',save_dir,mynode.name)
  310.                 s_handle:=Open(fichier_out,1006)
  311.                 w_save:=p_InitReq(fichier_out)
  312.                 n_faces:=mobj.nbrsfcs
  313.                 p_faces:=mobj.datafcs
  314.                 Write(s_handle,[n_faces]:INT,2)
  315.                 FOR b_faces:=0 TO n_faces-1
  316.                     Write(s_handle,[3,5,Long(p_faces)*4,Long(p_faces+4)*4,Long(p_faces+8)*4,Long(p_faces)*4,0,0,0,0,0]:INT,22)
  317.                     p_faces:=p_faces+12
  318.                 ENDFOR
  319.                 IF s_handle THEN Close(s_handle)
  320.                 IF w_save THEN CloseW(w_save)
  321.                 saveit:=FALSE
  322.             ENDIF
  323.         ENDIF
  324.         mynode:=mynode.succ
  325.     ENDWHILE
  326. ENDPROC
  327. /**/
  328.  
  329.